package com.gitee.generator.universal.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import com.gitee.generator.universal.common.DefaultValArrayList;
import lombok.Data;

/**
 * [表] Table
 * @since 2020-08-19 11:24
 * @author wsx
 */
@Data
public class Table implements Serializable {
    /** serialVersionUID */
    private static final long serialVersionUID = 1L;
    /** 表名，配置文件中的 tables属性的key，若生成全部表，则使用查库获得的表名称*/
    private String tableName;
    /** 表的注释，若配置文件没有，则取表注释*/
    private String remarks;
    /** 表类型 table/view */
    private String tableType;
    /** 主键字段名称*/
    private Set<String> pkNames;
    /** 需要导包的类*/
    private Set<String> needImportClass;
    /** 主键字段*/
    private List<TableColumn> pkColumns;
    /** 列，查询数据库中表结构获得*/
    private List<TableColumn> columns;
    /** 要删除的前缀，配置文件中project中配置，运行时设置到这里*/
    private List<String> removePrefix;
    /** 业务模块名*/
    private String modelName="";
    /** 业务模块名*/
    private String modelChineseName="";
    /** 业务模块名list，自定义有默认值的List,List中如果没有值，则使用modelName，为了兼容同一个表，在不同的层使用不同的模块名的问题*/
    private List<String> modelNames;
    /** 是否生成表，配置文件中配置*/
    private Boolean generate=true;
    /** 驼峰状命名 */
    public String getCamelCaseName() {
        return CharSequenceUtil.toCamelCase(this.getRemovePrefixTableName());
    }
    /** 帕斯卡命名 */
    public String getPascalCaseName() {
        return CharSequenceUtil.upperFirst(CharSequenceUtil.toCamelCase(this.getRemovePrefixTableName()));
    }
    /** 下划线命名 */
    public String getUnderlineCaseName() {
        return CharSequenceUtil.upperFirst(CharSequenceUtil.toUnderlineCase(this.getRemovePrefixTableName()));
    }
    /** 类名，首字母小写。用的是驼峰命名，为了兼容代码生成器 */
    public String getClassNameFirstLower() {
        return getCamelCaseName();
    }
    /** 类名，用的是帕斯卡命名，为了兼容代码生成器 */
    public String getClassName() {
        return getPascalCaseName();
    }
    public String getRemovePrefixTableName(){
        return removeAllPrefix(tableName);
    }
    /**
     * 移除前缀
     * @param str 前缀
     */
    private String removeAllPrefix(String str) {
        if (removePrefix != null && !removePrefix.isEmpty()) {
            String tempStr = str;
            for (String prefixNeedRemove : removePrefix) {
                str = CharSequenceUtil.removePrefix(str, prefixNeedRemove.trim());
                if(!tempStr.equals(str)){
                    break;
                }
            }
        }
        return str;
    }

    /**
     * 初始化模块名
     */
    public void initModelNames(){
        List<String> list = DefaultValArrayList.getInstance(this.modelName);
        if(null!=this.modelNames){
            list.addAll(this.modelNames);
        }
        this.modelNames = list;
    }

    /**
     * 表别名
     * @return 表别名
     */
    public String getTableAliasName() {
        String rpTableName = this.getRemovePrefixTableName();
        if (StrUtil.isEmpty(rpTableName)) {
            return "";
        }
        String[] s = rpTableName.split("_");
        StringBuilder aliasName = new StringBuilder();
        for(String c:s){
            aliasName.append(c.charAt(0));
        }
        return aliasName.toString().toLowerCase();
    }

}